var contentScript = document.createElement('script');
contentScript.src = chrome.runtime.getURL('scripts/inject_script.js');
contentScript.onload = function () {
	utils.log('Скрипт загружен на целевую страницу');
}
document.head.appendChild(contentScript);

window.addEventListener("message", function (event) {
	let inMsg = JSON.parse(event.data)
	if (inMsg['recipient'] === utils.current) {
		utils.logInMessage(inMsg)
		sendMessage(inMsg, 'options')
	} else {
		utils.logIgnoreMessage(inMsg)
	}
}, false);

function sendMessage(message, recipient) {
	message.sender = utils.current
	message.recipient = recipient
	utils.log('Пересылка сообщения по адресу: ' + message.recipient)
	utils.logOutMessage(message)
	chrome.runtime.sendMessage(JSON.stringify(message),
		async function(response) {
			if (chrome.runtime.lastError) {
				utils.log('Ошибка получения ответа от options.js, отправка ответа с ошибкой в inject_script.js');
				sendResponseToInjectScript('От страницы опций не получено ответа, требуется открыть страницу опций в фоновом режиме')
			} else {
				utils.logInMessage(JSON.parse(response))
				console.log('Отправка положительного ответа в inject_script.js')
				sendResponseToInjectScript('Сообщение успешно отправлено в компонент options.js')
			}
		});
}

function sendResponseToInjectScript(text) {
	let outMsg = new Object();
	outMsg.data = text
	outMsg.sender = utils.current
	outMsg.recipient = 'inject_script'
	utils.logOutMessage(outMsg)
	window.postMessage( JSON.stringify(outMsg) );
}

// В content_script.js невозможно импортировать сторонние библиотеки,
// как обходной путь - объявить класс в нужном скрипте.
// v 0.0.1
class MessageSenderUtils {
	constructor(current) {
		this.current = current;
	}

	getObject(name, value) {
		this.log(`=== Объект ${name}, тип данных: ${typeof value}]`)
		if (typeof value === 'string') {
			this.log(' - тип данных: string, значение: ' + value)
		} else {
			for (var key in value) {
				this.log(' > тип данных: ' + typeof value[key] + ', ключ: ' + key + ', значение: ' + value[key])
			}
		}
		try {
			this.log(' - JSON.parse: ' + JSON.parse(value))
		} catch(e) {}
		try {
			this.log(' - JSON.stringify: ' + JSON.stringify(value))
		} catch(e) {}
		this.log('===')
	}

	log(text) {
		console.log(`${this.getTimestamp()} [${this.current}] ${text}`)
	}

	table(object) {
		console.table(object)
	}

	getTimestamp() {
		var now = new Date();
		var date = new Date(now.getTime() - now.getTimezoneOffset() * 60000)
		return this.formatDateTime(date.toISOString());
	}

	formatDateTime(value) {
		return value.replace('T', ' ').replace('Z', '')
	}

	logMessage(from, to, message) {
		this.log(`${from} -> ${to}: ${message}`)
	}

	getEntry(type, typeSender, message) {
		let entry = new Object();
		entry.type = type
		entry.typeSender = typeSender
		entry.sender = this.current
		entry.message = message
		entry.time = this.getTimestamp()

		return entry
	}

	logOutMessage(message) {
		let result = `Исходящее сообщение:\n`
		result += `Отправитель: ${message.sender}\n`
		result += `Получатель: ${message.recipient}\n`
		result += `Данные: ${message.data}`

		this.log(result)
		
		if (message.sender === undefined) {
			console.warn(`Отcутствует значение: message.sender`)
		}
		if (message.recipient === undefined) {
			console.warn(`Отcутствует значение: message.recipient`)
		}
		if (message.data === undefined) {
			console.warn(`Отcутствует значение: message.data`)
		}
	}

	logInMessage(message) {
		let result = `Входящее сообщение:\n`

		result += `Отправитель: ${message.sender}\n`
		result += `Получатель: ${message.recipient}\n`
		result += `Данные: ${message.data}`

		this.log(result)

		if (message.sender === undefined) {
			console.warn(`Отcутствует значение: message.sender`)
		}
		if (message.recipient === undefined) {
			console.warn(`Отcутствует значение: message.recipient`)
		}
		if (message.data === undefined) {
			console.warn(`Отcутствует значение: message.data`)
		}
	}

	logIgnoreMessage(message) {
		this.log(`Сообщение проигнорировано, адресат: '${message['recipient']}'`)
	}
}
let utils = new MessageSenderUtils('content_script')